package com.example.chamberlainserver.Service;

import com.example.chamberlainserver.Entry.TimeReport;
import com.example.chamberlainserver.Vo.Request.TimeReport.TimeReportQuery;
import com.example.chamberlainserver.dto.PageResult;

import java.time.LocalDate;
import java.util.List;

/**
 * 时间填报服务接口
 */
public interface TimeReportService {
    /**
     * 添加时间填报记录
     */
    boolean addTimeReport(TimeReport timeReport);
    
    /**
     * 根据ID查询时间填报记录
     */
    TimeReport getTimeReportById(Integer id);
    
    /**
     * 根据用户ID查询时间填报记录列表
     */
    List<TimeReport> getTimeReportsByUserId(Integer userId);
    
    /**
     * 根据用户ID和日期查询时间填报记录
     */
    TimeReport getTimeReportByUserIdAndDate(Integer userId, LocalDate reportDate);
    
    /**
     * 查询所有时间填报记录
     */
    List<TimeReport> getAllTimeReports();
    
    /**
     * 根据状态查询时间填报记录
     */
    List<TimeReport> getTimeReportsByStatus(Integer status);
    
    /**
     * 更新时间填报记录
     */
    boolean updateTimeReport(TimeReport timeReport);
    
    /**
     * 删除时间填报记录
     */
    boolean deleteTimeReport(Integer id);
    
    /**
     * 分页查询时间填报记录列表
     * @param timeReportQuery 查询条件
     * @return 分页结果
     */
    PageResult<TimeReport> getPagedTimeReportList(TimeReportQuery timeReportQuery);
    
    /**
     * 审核时间填报记录
     * @param id 时间填报记录ID
     * @param status 审核状态
     * @param reviewerId 审核人ID
     * @param reviewComment 审核备注
     * @return 审核结果
     */
    boolean reviewTimeReport(Integer id, Integer status, Integer reviewerId, String reviewComment);
    
    /**
     * 批量审核时间填报记录
     * @param ids 时间填报记录ID列表
     * @param status 审核状态
     * @param reviewerId 审核人ID
     * @param reviewComment 审核备注
     * @return 审核结果
     */
    boolean batchReviewTimeReports(List<Integer> ids, Integer status, Integer reviewerId, String reviewComment);
    
    /**
     * 获取用户在指定日期范围内的工作时长统计
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 总工作时长
     */
    Double getTotalWorkHours(Integer userId, LocalDate startDate, LocalDate endDate);
}